package br.unicamp.ft.sahp.model.dao.impl;

import java.util.List;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import br.unicamp.ft.sahp.model.dao.AbstractDAO;
import br.unicamp.ft.sahp.model.dao.QuestaoDAO;
import br.unicamp.ft.sahp.model.entidades.Questao;
import br.unicamp.ft.sahp.model.exception.QuestaoNaoEncontradaException;

@Repository
public class QuestaoDAOImpl extends AbstractDAO<Questao, Long> implements
		QuestaoDAO {

	@Autowired
	public QuestaoDAOImpl(
			@Qualifier("entityManagerFactory") EntityManagerFactory factory) {
		super(factory, Questao.class);
	}
	
	@SuppressWarnings("unchecked")
	public List<Questao> findAllQuestoes() throws QuestaoNaoEncontradaException {
		
		String consulta = "SELECT questao FROM Questao questao " +
				"ORDER BY questao.descricaoQuestao";
		
		Query query = getEntityManager().createQuery(consulta);
		
		List<Questao> listaResultados = query.getResultList();
		
		if (listaResultados == null || listaResultados.isEmpty()) {
			throw new QuestaoNaoEncontradaException();
		}
		
		return listaResultados;
	}

	@SuppressWarnings("unchecked")
	public List<Questao> findQuestoesByDescricao(String descricaoQuestao)
			throws QuestaoNaoEncontradaException {

		String consulta = "SELECT questao FROM Questao questao "
				+ "WHERE UPPER(questao.descricaoQuestao) LIKE " +
						"'%' || UPPER(:descricaoQuestao) || '%'" +
						"ORDER BY questao.descricaoQuestao";
		
		Query query = getEntityManager().createQuery(consulta);
		query.setParameter("descricaoQuestao", descricaoQuestao);
		
		List<Questao> listaResultados = query.getResultList();
		
		if (listaResultados == null || listaResultados.isEmpty()) {
			throw new QuestaoNaoEncontradaException();
		}
		
		return listaResultados;
	}
}